#include "Texto.h"

Uint8 Texto::initTTF = 0;


Texto::Texto()
{
    if (initTTF == 0)
    {
	TTF_Init();
    }
    mRect.x = 0;
    mRect.y = 0;
    mRect.w = 0;
    mpFonte = NULL;
    mpDestino = NULL;
    mpFonte = NULL;
    mPalavras.clear();
    initTTF++;
}

SDL_bool Texto::inicializa(Uint16 larguraRect, string fonte,
                        Uint16 tamanhoFonte)
{
    mRect.w = larguraRect;
    mTamanhoFonte = tamanhoFonte;

    if(mpFonte != NULL)
    {
        TTF_CloseFont(mpFonte);
    }

    mpFonte = TTF_OpenFont(fonte.c_str(),mTamanhoFonte);

    if (mpFonte == NULL)
    {
        fprintf(stderr,"Erro ao carregar fonte %s \t %s \n",fonte.c_str(),TTF_GetError());
        return SDL_FALSE;
    }

    SDL_Color cor = {0,0,0};
    // apenas para retornar a largura e altura em pixels da cada caractere
    SDL_Surface* tmpSurface = TTF_RenderText_Solid(mpFonte, "W",cor);
    mLarguraFonte = tmpSurface->w;
    mAlturaFonte = tmpSurface->h;

    SDL_FreeSurface(tmpSurface);

    return SDL_TRUE;
}


void Texto::blitaTexto(string texto, Uint16 x, Uint16 y, Uint8 r, Uint8 g, Uint8 b)
{

    SDL_Color foreground = { r, g, b};  // Cor do texto

    // Isto renderiza nosso texto em uma superfície temporária
    SDL_Surface* temp = TTF_RenderText_Solid(mpFonte, texto.c_str(), foreground);

    // Uma estrutura que guarda o destino do nosso texto
    SDL_Rect destination = { x, y, 0, 0 };

    // Faz um blit com a superfície do texto a superfície da janela, o NULL
    // especifica toda a superfície
    SDL_BlitSurface(temp, NULL, mpDestino, &destination);

    // Libera a memória
    SDL_FreeSurface(temp);

}

void Texto::exibe(Uint16 x, Uint16 y,SDL_Surface* destino,
                    Uint8 r, Uint8 g, Uint8 b)
{
    mpDestino = destino;

    if (mPalavras.empty())
    {
        carregaString();
    }

    for (unsigned int i = 0; i < mPalavras.size(); i++)
    {
        // tamanho da string
        int tmpTamanho;
        // espacamento entre as linhas
        int tmpLinha;
        // se estiver no início, tamnanho da string e espaçamento
        // entre linhas serão zero
        if (i == 0)
        {
            tmpTamanho = 0;
            tmpLinha = 0;
        }
        else
        {
            tmpTamanho += mPalavras[i - 1].size();
        }

        // se tamanho total de caracteres na linha for maior que a largura
        // do rect, pula para a próxima linha
        if((tmpTamanho * mLarguraFonte + mPalavras[i].size()* mLarguraFonte) >= mRect.w )
        {
            tmpTamanho = 0;
            tmpLinha += mAlturaFonte;
        }

        blitaTexto(mPalavras[i], x + tmpTamanho*mLarguraFonte ,y + tmpLinha,r,g,b);

    }
    // limpa o vetor de palavras
    mPalavras.clear();
}

void Texto::carregaString()
{
    string temp;

    for(unsigned int i =0; i < mTexto.size();i++)
    {
        if(mTexto[i] == ' ')
        {
            temp+=" ";
            mPalavras.push_back(temp);
            temp.clear();
        }
        else
        {
            temp += mTexto[i];
        }
        if(i == mTexto.size() -1)
        {
            mPalavras.push_back(temp);
            temp.clear();
        }
    }
}

void Texto::escreve(string texto)
{
    mTexto.clear();
    mTexto = texto;
}

Texto::~Texto()
{
    if (mpFonte != NULL)
    {
        TTF_CloseFont(mpFonte);
    }
    initTTF--;
	
    if (initTTF == 0)
    {
	TTF_Quit();
    }
}
